<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>函数代码相互调用(Function code calls each other)</title>
  <!-- 
  在JavaScript中，函数可以相互调用，这种特性使得代码可以更加模块化和灵活。函数之间的相互调用可以帮助实现复杂的逻辑、递归算法以及协同工作。
  一、函数相互调用的定义
  - 相互调用：当一个函数在其内部调用另一个函数时，称为相互调用。反之亦然，另一个函数也可以调用第一个函数。
  - 这种调用关系可以是直接的，也可以通过多个函数的链式调用实现。

  二、示例
  1. 基本的相互调用：
    在以下示例中， `functionA`  调用  `functionB` ，而  `functionB`  又调用  `functionA` 。
    function functionA() {
      console.log("Function A is called.");
      functionB(); // 调用 functionB
    }

    function functionB() {
      console.log("Function B is called.");
      functionA(); // 调用 functionA
    }

    // 注意：直接调用会导致无限递归
    // functionA();
  在这个例子中，如果不加以控制， `functionA`  和  `functionB`  会无限递归调用，导致栈溢出错误。
  2. 控制调用次数：
    为了避免无限递归，可以通过参数或状态来控制调用次数。
    function functionA(count) {
      if (count > 0) {
        console.log("Function A is called. Count: " + count);
        functionB(count - 1); // 调用 functionB，并减少计数
      }
    }

    function functionB(count) {
      if (count > 0) {
        console.log("Function B is called. Count: " + count);
        functionA(count - 1); // 调用 functionA，并减少计数
      }
    }

    functionA(3); // 开始调用
  在这个例子中， `functionA`  和  `functionB`  交替调用，直到计数为0，避免了无限递归。

  三、递归调用
  - 递归：函数可以直接调用自身，称为递归。递归通常用于解决分治问题，如计算阶乘、斐波那契数列等。
    function factorial(n) {
      if (n <= 1) return 1; // 基本情况
      return n * factorial(n - 1); // 递归调用
    }

    console.log(factorial(5)); // 输出: 120

  四、注意事项
  1. 避免无限递归：
    - 在设计函数相互调用时，确保有明确的终止条件，避免无限递归导致的栈溢出。

  2. 性能考虑：
    - 过多的相互调用可能会导致性能下降，特别是在递归调用时，可能会消耗大量的栈空间。

  3. 代码可读性：
    - 适当地使用函数相互调用可以提高代码的可读性和模块化，但过度使用可能会使代码变得复杂。

  五、总结
  - JavaScript中的函数可以相互调用，这种特性使得代码更加灵活和模块化。
  - 通过适当的控制，可以实现复杂的逻辑和递归算法。
  - 在设计相互调用的函数时，注意避免无限递归和性能问题。
   -->
</head>
<body>

  <script>

    // 1. 函数相互调用
    function functionA(count) {
      if (count > 0) {
        console.log("Function A is called. Count: " + count);
        functionB(count - 1); // 调用 functionB，并减少计数
      }
    }

    function functionB(count) {
      if (count > 0) {
        console.log("Function B is called. Count: " + count);
        functionA(count - 1); // 调用 functionA，并减少计数
      }
    }

    functionA(3); // 开始调用

    // 2. 递归调用
    function factorial(n) {
      if (n <= 1) return 1;
      return n * factorial(n - 1);
    }

    console.log(factorial(5)); // 输出: 120
    
  </script>
  
</body>
</html>